package cn.tedu.tickets;/**
 * @Author 金帮嘉诚 @Date 2021-06-23 星期三 14:02
 */
/*本类用于解决继承下多线程售票案例的数据安全问题*/

/**
 * 知识点
 */
public class TestExtendsV2 {
    public static void main(String[] args) {
        TicketThreadV2 threadV20 = new TicketThreadV2();
        TicketThreadV2 threadV21 = new TicketThreadV2();
        TicketThreadV2 threadV22 = new TicketThreadV2();
        TicketThreadV2 threadV23 = new TicketThreadV2();

        threadV20.start();
        threadV21.start();
        threadV22.start();
        threadV23.start();
    }
}

class TicketThreadV2 extends Thread {
    static int ticketNumber = 100;

    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            //字节码对象 唯一
            /*双重校验二：使用同步代码块
            synchronized(锁对象){容易发生数据安全问题的代码}
            注意：锁对象必须唯一，如果不唯一，还会发生安全问题
            如果是继承的方式的话，锁对象一般使用本类的字节码对象*/
            //错误，因为每个线程都会new一个Object对象，锁对象不唯一
//            synchronized(new Object()){
            synchronized (TicketThreadV2.class) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                /*双重校验一：有票的时候再卖票增加了一个判断*/
                if (ticketNumber > 0) {
                    System.out.println(getName() + "=" + ticketNumber--);
                }
                if (ticketNumber <= 0) break;
            }
        }
    }
}

